/**
 * 自制JSON解析与转换函数 2012-3-29
 */

(function($) {
	"use strict";
	$.zzJSON = $.zzJSON || {};
	$.extend($.zzJSON, {

				// implement JSON.stringify serialization
				toJSONString : function(obj) {
					var t = typeof(obj);
					if (t != "object" || obj === null) { // simple data type
						if (t == "string")
							obj = '"' + obj + '"';
						return String(obj);

					} else { // recurse array or object
						var n, v, json = [], arr = (obj && obj.constructor == Array);
						for (n in obj) {
							v = obj[n];
							t = typeof(v);
							if (t == "string")
								v = '"' + v + '"';
							else if (t == "object" && v !== null)
								v = JSON.stringify(v);
							json.push((arr ? "" : '"' + n + '":') + String(v));
						}
						return (arr ? "[" : "{") + String(json)
								+ (arr ? "]" : "}");
					}
				},

				parseJSON : function(data) {
					if (typeof data !== "string" || !data) {
						return null;
					}

					// Make sure leading/trailing whitespace is removed (IE
					// can't handle it)
					data = jQuery.trim(data);

					// Attempt to parse using the native JSON parser first
					if (window.JSON && window.JSON.parse) {
						return window.JSON.parse(data);
					}

					// Make sure the incoming data is actual JSON
					// Logic borrowed from http://json.org/json2.js
					if (rvalidchars.test(data.replace(rvalidescape, "@")
							.replace(rvalidtokens, "]").replace(rvalidbraces,
									""))) {

						return (new Function("return " + data))();

					}
					jQuery.error("Invalid JSON: " + data);
				}
			});

	/**
	 * example $.cookie(’name’, ‘value’); 设置cookie的值，把name变量的值设为value 
	 * example $.cookie(’name’, ‘value’, {expires: 7, path: ‘/’, domain: ‘jquery.com’,secure: true});
	 *  新建一个cookie 包括有效期 路径 域名等 
	 *  example $.cookie(’name’, ‘value’); 新建cookie 
	 *  example $.cookie(’name’, null); 删除一个cookie
	 * var account= $.cookie('name'); 取一个cookie(name)值给myvar
	 */
	jQuery.cookie = function(name, value, options) {
		if (typeof value != 'undefined') { // name and value given, set cookie
			options = options || {};
			if (value === null) {
				value = '';
				options.expires = -1;
			}
			var expires = '';
			if (options.expires
					&& (typeof options.expires == 'number' || options.expires.toUTCString)) {
				var date;
				if (typeof options.expires == 'number') {
					date = new Date();
					date.setTime(date.getTime()
							+ (options.expires * 24 * 60 * 60 * 1000));
				} else {
					date = options.expires;
				}
				expires = '; expires=' + date.toUTCString(); // use expires
				// attribute,
				// max-age is
				// not supported
				// by IE
			}
			var path = options.path ? '; path=' + options.path : '';
			var domain = options.domain ? '; domain=' + options.domain : '';
			var secure = options.secure ? '; secure' : '';
			document.cookie = [name, '=', encodeURIComponent(value), expires,
					path, domain, secure].join('');
		} else { // only name given, get cookie
			var cookieValue = null;
			if (document.cookie && document.cookie != '') {
				var cookies = document.cookie.split(';');
				for (var i = 0; i < cookies.length; i++) {
					var cookie = jQuery.trim(cookies[i]);
					// Does this cookie string begin with the name we want?
					if (cookie.substring(0, name.length + 1) == (name + '=')) {
						cookieValue = decodeURIComponent(cookie
								.substring(name.length + 1));
						break;
					}
				}
			}
			return cookieValue;
		}
	};
})(jQuery);